home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / wildcat / digikit.zip / OODIGI.PAS < prev    next >
Pascal/Delphi Source File  |  1992-07-16  |  9KB  |  373 lines

  1. {$S-,R-,V-,I-,B-,F+,O+,A-}
  2.  
  3. {Conditional defines that may affect this unit}
  4. {$I APDEFINE.INC}
  5.  
  6. {Include OPro's define file if UseOPro is specified}
  7. {$IFDEF UseOPro}
  8. {$I OPDEFINE.INC}
  9. {$ENDIF}
  10.  
  11. {*********************************************************}
  12. {*                   OODIGI.PAS 1.04                     *}
  13. {*         Copyright (c) Mustang Software 1992.          *}
  14. {*                 All rights reserved.                  *}
  15. {*********************************************************}
  16.  
  17. unit OoDigi;
  18.  
  19. interface
  20.  
  21. uses
  22.   Dos,
  23.   {$IFDEF UseOPro}
  24.   OpRoot,
  25.   OpInline,
  26.   {$ENDIF}
  27.   {$IFDEF UseTPro}
  28.   TpInline,
  29.   TpMemChk,
  30.   {$ENDIF}
  31.   ApMisc,
  32.   ApPort,
  33.   ApTimer,
  34.   OoCom,
  35.   ApDigi;
  36.  
  37. type
  38.   DigiPortPtr = ^DigiPort;
  39.   DigiPort = object(AbstractPort)
  40.     constructor InitFast(ComName : ComNameType; NewBaud : LongInt);
  41.       {-Opens ComName with default line options}
  42.     constructor InitCustom(ComName : ComNameType; Baud : LongInt;
  43.                            Parity : ParityType; DataBits : DataBitType;
  44.                            StopBits : StopBitType;
  45.                            InSize, OutSize : Word;
  46.                            Options : Word);
  47.       {-Opens the ComName com port}
  48.     constructor InitKeep(ComName : ComNameType; InSize, OutSize : Word);
  49.       {-Opens ComName (without changing line options)}
  50.  
  51.     {#Z+}
  52.     destructor Done; virtual;
  53.       {-Closes the com port}
  54.  
  55.     {---- Low level hooks ----}
  56.     function  GetLineStatus : Byte; Virtual;
  57.     procedure SetLine(Baud : LongInt; Parity : ParityType;
  58.                       DataBits : DataBitType;
  59.                       StopBits : StopBitType); virtual;
  60.       {-Calls device-level SetLine}
  61.     procedure GetLine(var Baud : LongInt; var Parity : ParityType;
  62.                       var DataBits : DataBitType;
  63.                       var StopBits : StopBitType;
  64.                       FromHardware : Boolean); virtual;
  65.       {-Calls device-level GetLine}
  66.     procedure SetModem(DTR, RTS : Boolean); virtual;
  67.       {-Calls device-level SetModem}
  68.     procedure GetModem(var DTR, RTS : Boolean); virtual;
  69.       {-Calls device-level GetModem}
  70.     procedure GetChar(var C : Char); virtual;
  71.       {-Calls device-level GetChar}
  72.     procedure PeekChar(var C : Char; PeekAhead : Word); virtual;
  73.       {-Calls device-level PeekChar}
  74.     procedure PutChar(C : Char); virtual;
  75.       {-Calls device-level PutChar}
  76.     procedure StartTransmitter; virtual;
  77.       {-(Re)starts the transmit stream}
  78.     function CharReady : Boolean; virtual;
  79.       {-Returns True if at least one character has been received}
  80.     function TransReady : Boolean; virtual;
  81.       {-Returns True if it's ok to transmit one character}
  82.     procedure SendBreak; virtual;
  83.       {-Calls device-level SendBreak}
  84.     procedure ActivatePort(Restore : Boolean); virtual;
  85.       {-Calls device-level ActivatePort}
  86.     procedure DeactivatePort(Restore : Boolean); virtual;
  87.       {-Calls device-level DeactivatePort}
  88.     procedure SavePort(var PSR); virtual;
  89.       {-Calls device-level SavePort}
  90.     procedure RestorePort(var PSR); virtual;
  91.       {-Calls device-level RestorePort}
  92.     procedure GotError(StatusCode : Word); virtual;
  93.       {-Calls device-level GotError}
  94.  
  95.     function GetModemStatusPrim(ClearMask : Byte) : Byte; virtual;
  96.       {-Primitive to return modem status byte and clear selected bits}
  97.  
  98.     {----- Buffer management -----}
  99.     function InBuffUsed : Word; virtual;
  100.       {-Returns number of chars in input buffer}
  101.     function InBuffFree : Word; virtual;
  102.       {-Returns free space in input buffer}
  103.     function OutBuffUsed : Word; virtual;
  104.       {-Returns number of chars in output buffer}
  105.     function OutBuffFree : Word; virtual;
  106.       {-Returns free space in output buffer}
  107.     procedure FlushInBuffer; virtual;
  108.       {-Erases input buffer}
  109.     procedure FlushOutBuffer; virtual;
  110.       {-Erases output buffer}
  111.     {#Z-}
  112.   end;
  113.  
  114.  
  115. implementation
  116.  
  117.  
  118.   function DigiPort.GetModemStatusPrim(ClearMask : Byte) : Byte; assembler;
  119.   asm
  120.     les di,Self
  121.     les di,es:[di].PR
  122.     mov dl,es:[di].PortRec.PortName
  123.     xor dh,dh
  124.     mov ah,$03
  125.     int $14
  126.     mov ah,al
  127.     and ah,ClearMask
  128.     les di,Self
  129.     les di,es:[di].PR
  130.     mov es:[di].PortRec.ModemStatus,ah
  131.   end;
  132.  
  133.  
  134.   constructor DigiPort.InitFast(ComName : ComNameType; NewBaud : LongInt);
  135.   begin
  136.     with DefaultLineOptions do
  137.       InitCustom(ComName, NewBaud, Parity, DataBits, StopBits, InSize, OutSize, Options);
  138.     if AsyncStatus <> ecOk then
  139.       Fail;
  140.   end;
  141.  
  142.  
  143.   constructor DigiPort.InitKeep(ComName : ComNameType; InSize, OutSize : Word);
  144.   begin
  145.     if not AbstractPort.Init then
  146.       Fail;
  147.     dInitPortKeep(PR, ComName, InSize, OutSize);
  148.     if AsyncStatus <> ecOk then
  149.       Fail
  150.     else
  151.       begin
  152.         ComPortName := ComName;
  153.         WaitChar := NoWaitChar;
  154.       end;
  155.   end;
  156.  
  157.  
  158.   constructor DigiPort.InitCustom(ComName : ComNameType; Baud : LongInt;
  159.                                   Parity : ParityType; DataBits : DataBitType;
  160.                                   StopBits : StopBitType;
  161.                                   InSize, OutSize : Word;
  162.                                   Options : Word);
  163.   begin
  164.     if not AbstractPort.Init then
  165.       Fail;
  166.     dInitPort(PR, ComName, Baud, Parity, DataBits, StopBits, InSize, OutSize, Options);
  167.     if AsyncStatus <> ecOk then
  168.       Fail
  169.     else
  170.       begin
  171.         ComPortName := ComName;
  172.         WaitChar := NoWaitChar;
  173.       end;
  174.   end;
  175.  
  176.  
  177.   destructor DigiPort.Done;
  178.   begin
  179.     if PR <> nil then
  180.       dDonePort(PR);
  181.   end;
  182.  
  183.  
  184.   function DigiPort.GetLineStatus : Byte;
  185.   begin
  186.     GetLineStatus := dGetLineStatusDirect(PR);
  187.   end;
  188.  
  189.  
  190.   procedure DigiPort.SetLine(Baud : LongInt;
  191.                              Parity : ParityType;
  192.                              DataBits : DataBitType;
  193.                              StopBits : StopBitType);
  194.   begin
  195.     dSetLine(PR, Baud, Parity, DataBits, StopBits);
  196.   end;
  197.  
  198.  
  199.   procedure DigiPort.GetLine(var Baud : LongInt;
  200.                              var Parity : ParityType;
  201.                              var DataBits : DataBitType;
  202.                              var StopBits : StopBitType;
  203.                              FromHardware : Boolean);
  204.   begin
  205.     dGetLine(PR, Baud, Parity, DataBits, StopBits, FromHardware);
  206.   end;
  207.  
  208.  
  209.   procedure DigiPort.SetModem(DTR, RTS : Boolean);
  210.   begin
  211.     dSetModem(PR, DTR, RTS);
  212.   end;
  213.  
  214.  
  215.   procedure DigiPort.GetModem(var DTR, RTS : Boolean);
  216.   begin
  217.     dGetModem(PR, DTR, RTS);
  218.   end;
  219.  
  220.  
  221.   procedure DigiPort.GetChar(var C : Char);
  222.   begin
  223.     dGetChar(PR, C);
  224.   end;
  225.  
  226.  
  227.   procedure DigiPort.PeekChar(var C : Char; PeekAhead : Word);
  228.   begin
  229.     dPeekChar(PR, C, PeekAhead);
  230.   end;
  231.  
  232.  
  233.   procedure DigiPort.StartTransmitter;
  234.   begin
  235.     dStartTransmitter(PR);
  236.   end;
  237.  
  238.  
  239.   procedure DigiPort.PutChar(C : Char);
  240.   begin
  241.     dPutChar(PR, C);
  242.   end;
  243.  
  244.  
  245.   function DigiPort.CharReady : Boolean;
  246.   begin
  247.     CharReady := dCharReady(PR);
  248.   end;
  249.  
  250.  
  251.   function DigiPort.TransReady : Boolean;
  252.   begin
  253.     TransReady := dTransReady(PR);
  254.   end;
  255.  
  256.  
  257.   procedure DigiPort.SendBreak;
  258.   begin
  259.     dSendBreak(PR);
  260.   end;
  261.  
  262.  
  263.   procedure DigiPort.ActivatePort(Restore : Boolean);
  264.   begin
  265.     dActivatePort(PR, Restore);
  266.   end;
  267.  
  268.  
  269.   procedure DigiPort.DeactivatePort(Restore : Boolean);
  270.   begin
  271.     dDeactivatePort(PR, Restore);
  272.   end;
  273.  
  274.  
  275.   procedure DigiPort.SavePort(var PSR);
  276.   begin
  277.     dSavePort(PR, PSR);
  278.   end;
  279.  
  280.  
  281.   procedure DigiPort.RestorePort(var PSR);
  282.   begin
  283.     dRestorePort(PR, PSR);
  284.   end;
  285.  
  286.  
  287.   procedure DigiPort.GotError(StatusCode : Word);
  288.   begin
  289.     dGotError(PR, StatusCode);
  290.   end;
  291.  
  292.  
  293.   function DigiPort.InBuffUsed : Word; assembler;
  294.   asm
  295.     les di,Self
  296.     les di,es:di.PR
  297.     mov dl,es:[di].PortRec.PortName
  298.     xor dh,dh
  299.     mov ah,$0A
  300.     int $14
  301.   end;
  302.  
  303.  
  304.   function DigiPort.InBuffFree : Word;
  305.   begin
  306.     RunError(211);
  307.   end;
  308.  
  309.  
  310.   function DigiPort.OutBuffUsed : Word; assembler;
  311.   asm
  312.     les di,Self
  313.     les di,es:[di].PR
  314.     mov dl,es:[di].PortRec.PortName
  315.     xor dh,dh
  316.     mov ah,$12
  317.     int $14
  318.     inc ax
  319.     mov dx,ax
  320.     les di,Self
  321.     les di,es:[di].PR
  322.     mov ax,es:[di].PortRec.OutBuffLen
  323.     sub ax,dx
  324.   end;
  325.  
  326.  
  327.   function DigiPort.OutBuffFree : Word;
  328.   var
  329.     FreeSpace, PercentFree : Word;
  330.  
  331.   begin
  332.     asm
  333.       les di,Self
  334.       les di,es:[di].PR
  335.       mov dl,es:[di].PortRec.PortName
  336.       xor dh,dh
  337.       mov ah,$12
  338.       int $14
  339.       inc ax
  340.       mov FreeSpace,ax
  341.     end;
  342.     PercentFree := (FreeSpace * LongInt(100)) div PR^.OutBuffLen;
  343.     if PercentFree > 90 then
  344.       OutBuffFree := 65535
  345.     else
  346.       OutBuffFree := 0;
  347.   end;
  348.  
  349.  
  350.   procedure DigiPort.FlushInBuffer; assembler;
  351.   asm
  352.     les di,Self
  353.     les di,es:[di].PR
  354.     mov dl,es:[di].PortRec.PortName
  355.     xor dh,dh
  356.     mov ah,$10
  357.     int $14
  358.   end;
  359.  
  360.  
  361.   procedure DigiPort.FlushOutBuffer; assembler;
  362.   asm
  363.     les di,Self
  364.     les di,es:[di].PR
  365.     mov dl,es:[di].PortRec.PortName
  366.     xor dh,dh
  367.     mov ah,$11
  368.     int $14
  369.   end;
  370.  
  371.  
  372. end.
  373.